/**
  * @brief project LoadBanlancer, 定义了类LoadBanlancer
  * @file LoadBanlancer.h
  * @author Liu Shuo
  * @date 2011.5.15
  */

#include "main.h"
#include "Node.h"
#ifndef LOADBANLANCER
#define LOADBANLANCER

/**
  * @brief 定义了类LoadBanlancer
  * @class LoadBanlancer
  * @author Liu Shuo
  */

class LoadBanlancer{
public:
    LoadBanlancer();			/**< 构造函数 */
    ~LoadBanlancer();			/**< 析构函数 */
    void run();		            /**< initialize the LoadBanlancer and run */
    Node *getNextNode();        /**< 轮询获得下个可用节点 */
	void readConf(char *);		/**< 读取配置文件 */
    void serve();				/**< 对外提供服务 */
    void *receiveheartbeat(void *arg);	/**< 接收心跳 */
    void *receiveMessage(void *arg);	/**< 接收消息 */
    void *changeStatus(void *arg);		/**< 检查各字节点状态 */
    void *handleRequest(int, const struct sockaddr_in *);	/**< 对请求进行处理 */
    void *handleMesg(int, const struct sockaddr_in *);		/**< 对消息进行处理 */
    Node *getNextNodeByIP(uint32_t);         /**< 通过IP获得下个可用节点 */
private:
    vector<Node *> nodeVector;				/**< 存放节点信息的容器 */
    vector<Node *>::size_type m_nextNode;   /**< 转发请求时，下一个节点的序号 */
    pthread_t m_heatbeatPthread;			/**< 接受心跳的线程ID */
    pthread_t m_messagePthread;				/**< 接受消息的线程ID */
    pthread_t m_statusPthread;				/**< 变更状态的线程ID */
    pthread_mutex_t m_nextNodeLock;         /**< m_nextNode的互斥锁 */
    int m_heartbeatPort;/**< 接收心跳的端口 */
    int m_messagePort;  /**< 接收消息的端口 */
    int m_servicePort;  /**< 对外提供服务的端口 */
    int m_policy;       /**< 客户端请求转发策略 0：采用轮询的方式转发 1: 根据源IP哈希转发 */
    int m_rsNum;		/**< 二层服务器的数量 */
};

/** @brief the arg of the function thread_handleRequest */
struct requestArgs{
    LoadBanlancer *LB;          /**< 指向LoadBanlancer */
    struct sockaddr_in cliaddr; /**< 客户端的地址结构*/
    int connfd;                 /**< 客户端的socket套接字*/
};


#endif
